package kr.pe.johnkim.waiting.mobile.controller;

import kr.pe.johnkim.waiting.mobile.domain.WaitingMember;
import kr.pe.johnkim.waiting.mobile.domain.WaitingSMS;
import kr.pe.johnkim.waiting.mobile.domain.WaitingUser;
import kr.pe.johnkim.waiting.mobile.service.WaitingMemberService;
import kr.pe.johnkim.waiting.mobile.service.WaitingUserService;
import kr.pe.johnkim.waiting.mobile.util.WaitingCommon;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

/**
 * Waiting 사용자 관련 controller 클래스 이다.
 *
 * @author : John_Kim <cale9797@gmail.com>
 * @date : 13. 4. 10.
 */
@Controller
@RequestMapping(value = "/waitingUserController")
public class WaitingUserController {

    // SLF4J Logging
    private Logger logger = LoggerFactory.getLogger(WaitingUserController.class);

    @Autowired
    private WaitingUserService waitingUserService;

    @Autowired
    private WaitingMemberService waitingMemberService;

    @Autowired
    private WaitingCommon waitingCommon;

    /**
     * 이미 등록된 사용자 대기가 있는지 확인 한다.
     *
     * @param waitingUser
     * @return
     * @throws Exception
     */
    @RequestMapping(value = "/selectDuplicationUser", method = RequestMethod.POST)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public WaitingUser selectDuplicationUser(@RequestBody WaitingUser waitingUser) throws Exception {
        logger.info("selectDuplicationUser");

        logger.info("merchantId  : {}", waitingUser.getMerchantId());
        logger.info("userName    : {}", waitingUser.getUserName());
        logger.info("qrCode      : {}", waitingUser.getQrCode());
        logger.info("phoneNumber : {}", waitingUser.getPhoneNumber());
        logger.info("admissionYn : {}", waitingUser.getAdmissionYn());
        logger.info("activateYn  : {}", waitingUser.getActivateYn());

        return this.waitingUserService.selectDuplicationUser(waitingUser);
    }
    /**
     * 사용자가 대기 등록된 가맹점의 정보를 가져 온다.
     *
     * @param waitingUser
     * @return
     * @throws Exception
     */
    @RequestMapping(value = "/selectUserMerchantInformation", method = RequestMethod.POST)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public WaitingUser selectUserMerchantInformation(@RequestBody WaitingUser waitingUser) throws Exception {
        logger.info("selectUserMerchantInformation");

//        waitingUser.setRegisterDate(waitingUser.getRegisterDate().substring(0, 10));

        waitingUser.setYesterdayString(this.waitingCommon.getYesterdayString());
        waitingUser.setTomorrowString(this.waitingCommon.getTomorrowString());

        logger.info("qrCode       : {}", waitingUser.getQrCode());
        logger.info("admissionYn  : {}", waitingUser.getAdmissionYn());
        logger.info("activateYn   : {}", waitingUser.getActivateYn());
        logger.info("registerDate : {}", waitingUser.getRegisterDate());

        return this.waitingUserService.selectUserMerchantInformation(waitingUser);
    }

    /**
     * 대기를 등록 한다.
     *
     * @param waitingUser
     * @return
     * @throws Exception
     */
    @RequestMapping(value = "/registerUser", method = RequestMethod.POST)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public WaitingUser registerUser(@RequestBody WaitingUser waitingUser) throws Exception {
        logger.info("registerUser");

        logger.info("merchantId            : {}", waitingUser.getMerchantId());
        logger.info("userName              : {}", waitingUser.getUserName());
        logger.info("qrCode                : {}", waitingUser.getQrCode());
        logger.info("phoneNumber           : {}", waitingUser.getPhoneNumber());
//        logger.info("numberWaiting         : {}", waitingUser.getNumberWaiting());
        logger.info("registrationId        : {}", waitingUser.getRegistrationId());
        logger.info("receiveNotificationYn : {}", waitingUser.getReceiveNotificationYn());
        logger.info("companion             : {}", waitingUser.getCompanion());
        logger.info("admissionYn           : {}", waitingUser.getAdmissionYn());
        logger.info("nextTurnYn            : {}", waitingUser.getNextTurnYn());
        logger.info("activateYn            : {}", waitingUser.getActivateYn());
        logger.info("modifyDate            : {}", waitingUser.getModifyDate());
        logger.info("registerDate          : {}", waitingUser.getRegisterDate());

        WaitingUser result = new WaitingUser();

        try {
            // 대기 등록 갯수를 가져오기 위해서 파라메터를 따로 세팅한다.
            // registerDate 를 like 검색하기 위해서 필요.
            WaitingUser waitingNumberParameter = new WaitingUser();
            waitingNumberParameter.setMerchantId(waitingUser.getMerchantId());
            waitingNumberParameter.setUserName(waitingUser.getUserName());
            waitingNumberParameter.setQrCode(waitingUser.getQrCode());
            waitingNumberParameter.setPhoneNumber(waitingUser.getPhoneNumber());
            waitingNumberParameter.setRegistrationId(waitingUser.getRegistrationId());
            waitingNumberParameter.setReceiveNotificationYn(waitingUser.getReceiveNotificationYn());
            waitingNumberParameter.setCompanion(waitingUser.getCompanion());
            waitingNumberParameter.setAdmissionYn(waitingUser.getAdmissionYn());
            waitingNumberParameter.setNextTurnYn(waitingUser.getNextTurnYn());
            waitingNumberParameter.setActivateYn(waitingUser.getActivateYn());
            waitingNumberParameter.setModifyDate(waitingUser.getModifyDate());
//            waitingNumberParameter.setRegisterDate(waitingUser.getRegisterDate().substring(0, 10));
            waitingNumberParameter.setYesterdayString(this.waitingCommon.getYesterdayString());
            waitingNumberParameter.setTomorrowString(this.waitingCommon.getTomorrowString());

            // (오늘) 대기 등록된 갯수를 가져 와서 1을 더한 다음에 다음 대기번호로 세팅해서 등록 한다.
            int numberWaiting = Integer.parseInt(this.waitingUserService.selectNumberWaiting(waitingNumberParameter).getTotalCount());

            logger.info("old waiting number : ", numberWaiting);

            numberWaiting++;
            waitingUser.setNumberWaiting(numberWaiting+"");

            this.waitingUserService.registerUser(waitingUser);
            result.setResult("SUCCESS");
            logger.info("success to register user.");
        } catch (Exception e) {
            result.setResult("FAIL");
            logger.error("fail to register user.");
        }

        // 등록에 성공하면 사용자에게 Push Notification / SMS 를 보낸다.
        if((result.getResult()).equals("SUCCESS")) {
            try {
                if(!(waitingUser.getQrCode()).equals("")) {
                    // QR 코드로 등록했으면 Push Notification 을 보낸다.
                    WaitingMember parameterMember = new WaitingMember();
                    parameterMember.setQrCode(waitingUser.getQrCode());

                    WaitingMember resultMember = this.waitingMemberService.selectMemberInformation(parameterMember);

                    String deviceType = resultMember.getDeviceType();
                    String registrationId = resultMember.getRegistrationId();
                    String receiveNotificationYn = resultMember.getReceiveNotificationYn();
                    String messageContent = "REGISTER_WAITING";

                    if((("AS").equals(deviceType)) && (("Y").equals(receiveNotificationYn)) && (!("").equals(registrationId))) {
                        // Android Smart Phone 으로 Push Notification 을 보낸다.
                        waitingCommon.sendASMessage(registrationId, messageContent);
                    } else if((("IS").equals(deviceType)) && (("Y").equals(receiveNotificationYn)) && (!("").equals(registrationId))) {
                        // iOS Smart Phone 으로 Push Notification 을 보낸다.
                        waitingCommon.sendIPMessage(registrationId, messageContent);
                        waitingCommon.testSendIPMessage(registrationId, messageContent);
                    }
                } else if(!(waitingUser.getPhoneNumber()).equals("")) {
                    // 전화번호로 등록했으면 SMS 를 보낸다.
                    WaitingSMS parameterSMS = new WaitingSMS();

                    parameterSMS.setMsg("대기목록에 등록되었습니다.");
                    parameterSMS.setRphone(waitingCommon.getSMSPhoneNumber(waitingUser.getPhoneNumber()));
                    parameterSMS.setSphone1("02");
                    parameterSMS.setSphone2("3775");
                    parameterSMS.setSphone3("3799");
                    parameterSMS.setRdate("");
                    parameterSMS.setRtime("");
                    parameterSMS.setTestflag("");
                    parameterSMS.setDestination(waitingCommon.getSMSPhoneNumber(waitingUser.getPhoneNumber()));
                    parameterSMS.setRepeatFlag("");
                    parameterSMS.setRepeatNum("");
                    parameterSMS.setRepeatTime("");
                    parameterSMS.setNointeractive("");

                    logger.info("sms : {}", waitingCommon.getSMSPhoneNumber(waitingUser.getPhoneNumber()));

                    this.waitingCommon.sendSMS(parameterSMS);
                }

                logger.info("success to send push notification or sms.");
            } catch (Exception e) {
                logger.info("fail to send push notification or sms.");
            }
        }

        return result;
    }

    /**
     * 다른 대기자가 없을 경우 해당 사용자를 대기자로 등록하고 next_turn_yn 을 업데이트 한다.
     *
     * 대기 등록할때 기존 대기 목록이 0이면 next_turn_yn 값을 'Y' 로 세팅해서 등록하고,
     * 0보다 크면 'N' 로 세팅해서 등록하면 되기 때문에 이 메소드는 사실상 사용하지 않는다.
     *
     * @param waitingUser
     * @return
     * @throws Exception
     */
    @RequestMapping(value = "/registerUserAndUpdateNextTurnYn", method = RequestMethod.POST)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public WaitingUser registerUserAndUpdateNextTurnYn(@RequestBody WaitingUser waitingUser) throws Exception {
        logger.info("registerUserAndUpdateNextTurnYn");

        logger.info("merchantId            : {}", waitingUser.getMerchantId());
        logger.info("userName              : {}", waitingUser.getUserName());
        logger.info("qrCode                : {}", waitingUser.getQrCode());
        logger.info("phoneNumber           : {}", waitingUser.getPhoneNumber());
//        logger.info("numberWaiting         : {}", waitingUser.getNumberWaiting());
        logger.info("registrationId        : {}", waitingUser.getRegistrationId());
        logger.info("receiveNotificationYn : {}", waitingUser.getReceiveNotificationYn());
        logger.info("companion             : {}", waitingUser.getCompanion());
        logger.info("admissionYn           : {}", waitingUser.getAdmissionYn());
        logger.info("nextTurnYn            : {}", waitingUser.getNextTurnYn());
        logger.info("activateYn            : {}", waitingUser.getActivateYn());
        logger.info("modifyDate            : {}", waitingUser.getModifyDate());
        logger.info("registerDate          : {}", waitingUser.getRegisterDate());

        WaitingUser result = new WaitingUser();

        try {
            // 대기 등록 갯수를 가져오기 위해서 파라메터를 따로 세팅한다.
            // registerDate 를 like 검색하기 위해서 필요.
            WaitingUser waitingNumberParameter = new WaitingUser();
            waitingNumberParameter.setMerchantId(waitingUser.getMerchantId());
            waitingNumberParameter.setUserName(waitingUser.getUserName());
            waitingNumberParameter.setQrCode(waitingUser.getQrCode());
            waitingNumberParameter.setPhoneNumber(waitingUser.getPhoneNumber());
            waitingNumberParameter.setRegistrationId(waitingUser.getRegistrationId());
            waitingNumberParameter.setReceiveNotificationYn(waitingUser.getReceiveNotificationYn());
            waitingNumberParameter.setCompanion(waitingUser.getCompanion());
            waitingNumberParameter.setAdmissionYn(waitingUser.getAdmissionYn());
            waitingNumberParameter.setNextTurnYn(waitingUser.getNextTurnYn());
            waitingNumberParameter.setActivateYn(waitingUser.getActivateYn());
            waitingNumberParameter.setModifyDate(waitingUser.getModifyDate());
//            waitingNumberParameter.setRegisterDate(waitingUser.getRegisterDate().substring(0, 10));
            waitingNumberParameter.setYesterdayString(this.waitingCommon.getYesterdayString());
            waitingNumberParameter.setTomorrowString(this.waitingCommon.getTomorrowString());

            // (오늘) 대기 등록된 갯수를 가져 와서 1을 더한 다음에 다음 대기번호로 세팅해서 등록 한다.
            int numberWaiting = Integer.parseInt(this.waitingUserService.selectNumberWaiting(waitingNumberParameter).getTotalCount());

            logger.info("old waiting number : ", numberWaiting);

            numberWaiting++;
            waitingUser.setNumberWaiting(numberWaiting + "");
            this.waitingUserService.registerUserAndUpdateNextTurnYn(waitingUser);
            result.setResult("SUCCESS");
        } catch (Exception e) {
            logger.error("fail to register and update.");
            result.setResult("FAIL");
        }

        /*
            등록 및 다음 대기자로 업데이트 하고 나면 다음 대기자라는 Push Notification / SMS 를 보낸다.
            등록 하자마다 다음 대기자이기 때문에 대기 등록되었다는 메시지는 생략 한다.
        * */
        if((result.getResult()).equals("SUCCESS")) {
            try {
                if(!(waitingUser.getQrCode()).equals("")) {
                    // QR 코드로 등록했으면 Push Notification 을 보낸다.
                    WaitingMember parameterMember = new WaitingMember();
                    parameterMember.setQrCode(waitingUser.getQrCode());

                    WaitingMember resultMember = this.waitingMemberService.selectMemberInformation(parameterMember);

                    String deviceType = resultMember.getDeviceType();
                    String registrationId = resultMember.getRegistrationId();
                    String receiveNotificationYn = resultMember.getReceiveNotificationYn();
                    String messageContent = "NEXT_TURN";

                    if((("AS").equals(deviceType)) && (("Y").equals(receiveNotificationYn)) && (!("").equals(registrationId))) {
                        // Android Smart Phone 으로 Push Notification 을 보낸다.
                        waitingCommon.sendASMessage(registrationId, messageContent);
                    } else if((("IS").equals(deviceType)) && (("Y").equals(receiveNotificationYn)) && (!("").equals(registrationId))) {
                        // iOS Smart Phone 으로 Push Notification 을 보낸다.
                        waitingCommon.sendIPMessage(registrationId, messageContent);
                        waitingCommon.testSendIPMessage(registrationId, messageContent);
                    }
                } else if(!(waitingUser.getPhoneNumber()).equals("")) {
                    // 전화번호로 등록했으면 SMS 를 보낸다.
                    WaitingSMS parameterSMS = new WaitingSMS();

                    parameterSMS.setMsg("다음 차례입니다.");
                    parameterSMS.setRphone(waitingCommon.getSMSPhoneNumber(waitingUser.getPhoneNumber()));
                    parameterSMS.setSphone1("02");
                    parameterSMS.setSphone2("3775");
                    parameterSMS.setSphone3("3799");
                    parameterSMS.setRdate("");
                    parameterSMS.setRtime("");
                    parameterSMS.setTestflag("");
                    parameterSMS.setDestination(waitingCommon.getSMSPhoneNumber(waitingUser.getPhoneNumber()));
                    parameterSMS.setRepeatFlag("");
                    parameterSMS.setRepeatNum("");
                    parameterSMS.setRepeatTime("");
                    parameterSMS.setNointeractive("");

                    logger.info("sms : {}", waitingCommon.getSMSPhoneNumber(waitingUser.getPhoneNumber()));

                    this.waitingCommon.sendSMS(parameterSMS);
                }

                logger.info("success to send push notification or sms.");
            } catch (Exception e) {
                logger.info("fail to send push notification or sms.");
            }
        }

        return result;
    }

    /**
     * 등록된 대기 정보를 가져 온다.
     *
     * @param waitingUser
     * @return
     * @throws Exception
     */
    @RequestMapping(value = "/selectUserInformation", method = RequestMethod.POST)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public WaitingUser selectUserInformation(@RequestBody WaitingUser waitingUser) throws Exception {
        logger.info("selectUserInformation");

        logger.info("merchantId     : {}", waitingUser.getMerchantId());
//        logger.info("idWaitingUsers : {}", waitingUser.getIdWaitingUsers());
        logger.info("userName       : {}", waitingUser.getUserName());
        logger.info("qrCode         : {}", waitingUser.getQrCode());
        logger.info("phoneNumber    : {}", waitingUser.getPhoneNumber());
        logger.info("activateYn     : {}", waitingUser.getActivateYn());

        return this.waitingUserService.selectUserInformation(waitingUser);
    }

    /**
     * 사용자 id 로 등록된 대기 정보를 가져 온다.
     *
     * @param waitingUser
     * @return
     * @throws Exception
     */
    @RequestMapping(value = "/selectUserInformationById", method = RequestMethod.POST)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public WaitingUser selectUserInformationById(@RequestBody WaitingUser waitingUser) throws Exception {
        logger.info("selectUserInformationById");

        logger.info("merchantId     : {}", waitingUser.getMerchantId());
        logger.info("idWaitingUsers : {}", waitingUser.getIdWaitingUsers());
        logger.info("activateYn     : {}", waitingUser.getActivateYn());

        return this.waitingUserService.selectUserInformationById(waitingUser);
    }

    /**
     * 대기를 취소 한다. 대기를 등록했다가 취소하는 경우 비활성화 한다.
     *
     * @param waitingUser
     * @return
     * @throws Exception
     */
    @RequestMapping(value = "/updateDeactivateUser", method = RequestMethod.POST)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public WaitingUser updateDeactivateUser(@RequestBody WaitingUser waitingUser) throws Exception {
        logger.info("updateDeactivateUser");

        WaitingUser result = new WaitingUser();

        try {
            this.waitingUserService.updateDeactivateUser(waitingUser);
            result.setResult("SUCCESS");
            logger.info("success to update deactivate user.");
        } catch (Exception e) {
            result.setResult("FAIL");
            logger.error("fail to update deactivate user.");
        }

        if((result.getResult()).equals("SUCCESS")) {
            try {
                // 사용자 id 로 사용자 정보를 가져 온다.
                WaitingUser deactivateUser = this.waitingUserService.selectUserInformationById(waitingUser);

                if(!(deactivateUser.getQrCode()).equals("")) {
                    // QR 코드로 등록했으면 Push Notification 을 보낸다.
                    WaitingMember parameterMember = new WaitingMember();
                    parameterMember.setQrCode(deactivateUser.getQrCode());

                    WaitingMember resultMember = this.waitingMemberService.selectMemberInformation(parameterMember);

                    String deviceType = resultMember.getDeviceType();
                    String registrationId = resultMember.getRegistrationId();
                    String receiveNotificationYn = resultMember.getReceiveNotificationYn();
                    String messageContent = "CANCEL";

                    if((("AS").equals(deviceType)) && (("Y").equals(receiveNotificationYn)) && (!("").equals(registrationId))) {
                        // Android Smart Phone 으로 Push Notification 을 보낸다.
                        waitingCommon.sendASMessage(registrationId, messageContent);
                    } else if((("IS").equals(deviceType)) && (("Y").equals(receiveNotificationYn)) && (!("").equals(registrationId))) {
                        // iOS Smart Phone 으로 Push Notification 을 보낸다.
                        waitingCommon.sendIPMessage(registrationId, messageContent);
                        waitingCommon.testSendIPMessage(registrationId, messageContent);
                    }
                } else if(!(deactivateUser.getPhoneNumber()).equals("")) {
                    // 전화번호로 등록했으면 SMS 를 보낸다.
                    WaitingSMS parameterSMS = new WaitingSMS();

                    parameterSMS.setMsg("대기가 취소되었습니다.");
                    parameterSMS.setRphone(waitingCommon.getSMSPhoneNumber(deactivateUser.getPhoneNumber()));
                    parameterSMS.setSphone1("02");
                    parameterSMS.setSphone2("3775");
                    parameterSMS.setSphone3("3799");
                    parameterSMS.setRdate("");
                    parameterSMS.setRtime("");
                    parameterSMS.setTestflag("");
                    parameterSMS.setDestination(waitingCommon.getSMSPhoneNumber(deactivateUser.getPhoneNumber()));
                    parameterSMS.setRepeatFlag("");
                    parameterSMS.setRepeatNum("");
                    parameterSMS.setRepeatTime("");
                    parameterSMS.setNointeractive("");

                    logger.info("sms : {}", waitingCommon.getSMSPhoneNumber(deactivateUser.getPhoneNumber()));

                    this.waitingCommon.sendSMS(parameterSMS);
                }

                logger.info("success to push notification or send SMS.");
            } catch (Exception e) {
                logger.error("fail to push notification or send SMS.");
            }
        }

        return result;
    }

    /**
     * 대기를 취소 한다. 다음 대기자의 next_turn_yn 의 값을 'Y' 로 업데이트 한다.
     *
     * @param waitingUser
     * @return
     * @throws Exception
     */
    @RequestMapping(value = "/updateDeactivateUserAndUserNextTurnYn", method = RequestMethod.POST)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public WaitingUser updateDeactivateUserAndUserNextTurnYn(@RequestBody WaitingUser waitingUser) throws Exception {
        logger.info("updateDeactivateUserAndUserNextTurnYn");

        WaitingUser result = new WaitingUser();

        try {
            this.waitingUserService.updateDeactivateUserAndUserNextTurnYn(waitingUser);
            result.setResult("SUCCESS");
            logger.info("success to update deactivate user and next turn.");
        } catch (Exception e) {
            result.setResult("FAIL");
            logger.error("fail to update deactivate user and next turn.");
        }

        // 대기 취소자에게 알린다.
        if((result.getResult()).equals("SUCCESS")) {
            try {
                /*
                사용자 id 로 사용자 정보를 가져 온다.
                대기 취소된 사용자 정보를 가져오기 위해서 activate_yn 의 값을 'N' 으로 세팅한다.
                현재 파라메터 값은,
                deactivateActivateYn : N
                activateYn : Y
                * */
                waitingUser.setIdWaitingUsers(waitingUser.getIdWaitingUserDeactivateYn());
                waitingUser.setActivateYn(waitingUser.getDeactivateActivateYn());
                WaitingUser deactivateUser = this.waitingUserService.selectUserInformationById(waitingUser);

                if(!(deactivateUser.getQrCode()).equals("")) {
                    // QR 코드로 등록했으면 Push Notification 을 보낸다.
                    WaitingMember parameterMember = new WaitingMember();
                    parameterMember.setQrCode(deactivateUser.getQrCode());

                    WaitingMember resultMember = this.waitingMemberService.selectMemberInformation(parameterMember);

                    String deviceType = resultMember.getDeviceType();
                    String registrationId = resultMember.getRegistrationId();
                    String receiveNotificationYn = resultMember.getReceiveNotificationYn();
                    String messageContent = "CANCEL";

                    if((("AS").equals(deviceType)) && (("Y").equals(receiveNotificationYn)) && (!("").equals(registrationId))) {
                        // Android Smart Phone 으로 Push Notification 을 보낸다.
                        waitingCommon.sendASMessage(registrationId, messageContent);
                    } else if((("IS").equals(deviceType)) && (("Y").equals(receiveNotificationYn)) && (!("").equals(registrationId))) {
                        // iOS Smart Phone 으로 Push Notification 을 보낸다.
                        waitingCommon.sendIPMessage(registrationId, messageContent);
                        waitingCommon.testSendIPMessage(registrationId, messageContent);
                    }
                } else if(!(deactivateUser.getPhoneNumber()).equals("")) {
                    // 전화번호로 등록했으면 SMS 를 보낸다.
                    WaitingSMS parameterSMS = new WaitingSMS();

                    parameterSMS.setMsg("대기가 취소되었습니다.");
                    parameterSMS.setRphone(waitingCommon.getSMSPhoneNumber(deactivateUser.getPhoneNumber()));
                    parameterSMS.setSphone1("02");
                    parameterSMS.setSphone2("3775");
                    parameterSMS.setSphone3("3799");
                    parameterSMS.setRdate("");
                    parameterSMS.setRtime("");
                    parameterSMS.setTestflag("");
                    parameterSMS.setDestination(waitingCommon.getSMSPhoneNumber(deactivateUser.getPhoneNumber()));
                    parameterSMS.setRepeatFlag("");
                    parameterSMS.setRepeatNum("");
                    parameterSMS.setRepeatTime("");
                    parameterSMS.setNointeractive("");

                    logger.info("sms : {}", waitingCommon.getSMSPhoneNumber(deactivateUser.getPhoneNumber()));

                    this.waitingCommon.sendSMS(parameterSMS);
                }

                logger.info("success to push notification or send SMS.");
            } catch (Exception e) {
                logger.error("fail to push notification or send SMS.");
            }
        }

        // 다음 대기자에게 알린다.
        if((result.getResult()).equals("SUCCESS")) {
            try {
                // 사용자 id 로 사용자 정보를 가져 온다.
                waitingUser.setIdWaitingUsers(waitingUser.getIdWaitingUsersNextTurnYn());
                waitingUser.setActivateYn("Y");
                WaitingUser nextTurnUser = this.waitingUserService.selectUserInformationById(waitingUser);

                if(!(nextTurnUser.getQrCode()).equals("")) {
                    // QR 코드로 등록했으면 Push Notification 을 보낸다.
                    WaitingMember parameterMember = new WaitingMember();
                    parameterMember.setQrCode(nextTurnUser.getQrCode());

                    WaitingMember resultMember = this.waitingMemberService.selectMemberInformation(parameterMember);

                    String deviceType = resultMember.getDeviceType();
                    String registrationId = resultMember.getRegistrationId();
                    String receiveNotificationYn = resultMember.getReceiveNotificationYn();
                    String messageContent = "NEXT_TURN";

                    if((("AS").equals(deviceType)) && (("Y").equals(receiveNotificationYn)) && (!("").equals(registrationId))) {
                        // Android Smart Phone 으로 Push Notification 을 보낸다.
                        waitingCommon.sendASMessage(registrationId, messageContent);
                    } else if((("IS").equals(deviceType)) && (("Y").equals(receiveNotificationYn)) && (!("").equals(registrationId))) {
                        // iOS Smart Phone 으로 Push Notification 을 보낸다.
                        waitingCommon.sendIPMessage(registrationId, messageContent);
                        waitingCommon.testSendIPMessage(registrationId, messageContent);
                    }
                } else if(!(nextTurnUser.getPhoneNumber()).equals("")) {
                    // 전화번호로 등록했으면 SMS 를 보낸다.
                    WaitingSMS parameterSMS = new WaitingSMS();

                    parameterSMS.setMsg("다음 차례입니다.");
                    parameterSMS.setRphone(waitingCommon.getSMSPhoneNumber(nextTurnUser.getPhoneNumber()));
                    parameterSMS.setSphone1("02");
                    parameterSMS.setSphone2("3775");
                    parameterSMS.setSphone3("3799");
                    parameterSMS.setRdate("");
                    parameterSMS.setRtime("");
                    parameterSMS.setTestflag("");
                    parameterSMS.setDestination(waitingCommon.getSMSPhoneNumber(nextTurnUser.getPhoneNumber()));
                    parameterSMS.setRepeatFlag("");
                    parameterSMS.setRepeatNum("");
                    parameterSMS.setRepeatTime("");
                    parameterSMS.setNointeractive("");

                    logger.info("sms : {}", waitingCommon.getSMSPhoneNumber(nextTurnUser.getPhoneNumber()));

                    this.waitingCommon.sendSMS(parameterSMS);
                }

                logger.info("success to push notification or send SMS.");
            } catch (Exception e) {
                logger.error("fail to push notification or send SMS.");
            }
        }

        return result;
    }

    /**
     * (오늘) 대기 목록을 가져 온다. iPad 에 출력 한다.
     *
     * @param waitingUser
     * @return
     * @throws Exception
     */
    @RequestMapping(value = "/selectUserList", method = RequestMethod.POST)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public List<WaitingUser> selectUserList(@RequestBody WaitingUser waitingUser) throws Exception {
        logger.info("selectUserList");

//        waitingUser.setRegisterDate(waitingUser.getRegisterDate().substring(0, 10));

        waitingUser.setYesterdayString(this.waitingCommon.getYesterdayString());
        waitingUser.setTomorrowString(this.waitingCommon.getTomorrowString());

        logger.info("merchantId   : {}", waitingUser.getMerchantId());
        logger.info("admissionYn  : {}", waitingUser.getAdmissionYn());
        logger.info("activateYn   : {}", waitingUser.getActivateYn());
        logger.info("registerDate : {}", waitingUser.getRegisterDate());

        return this.waitingUserService.selectUserList(waitingUser);
    }

    /**
     * (오늘) 총 대기 인원 숫자를 가져 온다. iPad 에 출력 한다.
     *
     * @param waitingUser
     * @return
     * @throws Exception
     */
    @RequestMapping(value = "/selectUserTotalCount", method = RequestMethod.POST)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public WaitingUser selectUserTotalCount(@RequestBody WaitingUser waitingUser) throws Exception {
        logger.info("selectUserTotalCount");

//        waitingUser.setRegisterDate(waitingUser.getRegisterDate().substring(0, 10));

        waitingUser.setYesterdayString(this.waitingCommon.getYesterdayString());
        waitingUser.setTomorrowString(this.waitingCommon.getTomorrowString());

        logger.info("merchantId   : {}", waitingUser.getMerchantId());
        logger.info("admissionYn  : {}", waitingUser.getAdmissionYn());
//        logger.info("nextTurnYn   : {}", waitingUser.getNextTurnYn());
        logger.info("activateYn   : {}", waitingUser.getActivateYn());
        logger.info("registerDate : {}", waitingUser.getRegisterDate());

        return this.waitingUserService.selectUserTotalCount(waitingUser);
    }

    /**
     * 현재 대기자를 입장 처리 한다.
     *
     * @param waitingUser
     * @return
     * @throws Exception
     */
    @RequestMapping(value = "/updateUserAdmissionYn", method = RequestMethod.POST)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public WaitingUser updateUserAdmissionYn(@RequestBody WaitingUser waitingUser) throws Exception {
        logger.info("updateUserAdmissionYn");

        logger.info("merchantId     : {}", waitingUser.getMerchantId());
        logger.info("activateYn     : {}", waitingUser.getActivateYn());
        logger.info("idWaitingUsers : {}", waitingUser.getIdWaitingUsers());
        logger.info("nextTurnYn     : {}", waitingUser.getNextTurnYn());
        logger.info("admissionYn    : {}", waitingUser.getAdmissionYn());
        logger.info("modifyDate     : {}", waitingUser.getModifyDate());

        WaitingUser result = new WaitingUser();

        try {
            this.waitingUserService.updateUserAdmissionYn(waitingUser);
            result.setResult("SUCCESS");
            logger.info("success to update user admission yn.");
        } catch (Exception e) {
            result.setResult("FAIL");
            logger.error("fail to update user admission yn.");
        }

        if((result.getResult()).equals("SUCCESS")) {
            try {

                // 사용자 id 로 사용자 정보를 가져 온다.
                WaitingUser admissionUser = this.waitingUserService.selectUserInformationById(waitingUser);

                if(!(admissionUser.getQrCode()).equals("")) {
                    // QR 코드로 등록했으면 Push Notification 을 보낸다.
                    WaitingMember parameterMember = new WaitingMember();
                    parameterMember.setQrCode(admissionUser.getQrCode());

                    WaitingMember resultMember = this.waitingMemberService.selectMemberInformation(parameterMember);

                    String deviceType = resultMember.getDeviceType();
                    String registrationId = resultMember.getRegistrationId();
                    String receiveNotificationYn = resultMember.getReceiveNotificationYn();
                    String messageContent = "ADMISSION";

                    if((("AS").equals(deviceType)) && (("Y").equals(receiveNotificationYn)) && (!("").equals(registrationId))) {
                        // Android Smart Phone 으로 Push Notification 을 보낸다.
                        waitingCommon.sendASMessage(registrationId, messageContent);
                    } else if((("IS").equals(deviceType)) && (("Y").equals(receiveNotificationYn)) && (!("").equals(registrationId))) {
                        // iOS Smart Phone 으로 Push Notification 을 보낸다.
                        waitingCommon.sendIPMessage(registrationId, messageContent);
                        waitingCommon.testSendIPMessage(registrationId, messageContent);
                    }
                } else if(!(admissionUser.getPhoneNumber()).equals("")) {
                    // 전화번호로 등록했으면 SMS 를 보낸다.
                    WaitingSMS parameterSMS = new WaitingSMS();

                    parameterSMS.setMsg("입장하시기 바랍니다.");
                    parameterSMS.setRphone(waitingCommon.getSMSPhoneNumber(admissionUser.getPhoneNumber()));
                    parameterSMS.setSphone1("02");
                    parameterSMS.setSphone2("3775");
                    parameterSMS.setSphone3("3799");
                    parameterSMS.setRdate("");
                    parameterSMS.setRtime("");
                    parameterSMS.setTestflag("");
                    parameterSMS.setDestination(waitingCommon.getSMSPhoneNumber(admissionUser.getPhoneNumber()));
                    parameterSMS.setRepeatFlag("");
                    parameterSMS.setRepeatNum("");
                    parameterSMS.setRepeatTime("");
                    parameterSMS.setNointeractive("");

                    logger.info("sms : {}", waitingCommon.getSMSPhoneNumber(admissionUser.getPhoneNumber()));

                    this.waitingCommon.sendSMS(parameterSMS);
                }

                logger.info("success to send push notification or sms.");
            } catch (Exception e) {
                logger.info("fail to send push notification or sms.");
            }
        }

        return result;
    }

    /**
     * 아래의 selectUserNextTurn 메소드와 통합.
     *
     * 1. 다음 대기자를 찾는다.
     * 2. 다음 대기자의 next_turn_yn 값을 'Y' 로 업데이트 한다.
     *
     * updateUserAdmissionYn 과 transaction 을 하나로 묶기 위해서 아래의 updateUserAdmissionYnAndUserNextTurnYn 메소드와 통합.
     *
     * 이 메소드는 더이상 사용되지 않는다.
     *
     * @param waitingUser
     * @return
     * @throws Exception
     */
    @RequestMapping(value = "/updateUserNextTurnYn", method = RequestMethod.POST)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public WaitingUser updateUserNextTurnYn(@RequestBody WaitingUser waitingUser) throws Exception {
        logger.info("updateUserNextTurnYn");

        logger.info("merchantId     : {}", waitingUser.getMerchantId());
        logger.info("activateYn     : {}", waitingUser.getActivateYn());
        logger.info("admissionYn    : {}", waitingUser.getAdmissionYn());
        logger.info("idWaitingUsers : {}", waitingUser.getIdWaitingUsers());
        logger.info("modifyDate     : {}", waitingUser.getModifyDate());

        // 기존의 다음대기자가 아닌 대기자 중에서 찾는다.
        waitingUser.setOldNextTurnYn("N");

        WaitingUser result = new WaitingUser();

        try {
            this.waitingUserService.updateUserNextTurnYn(waitingUser);
            result.setResult("SUCCESS");
            logger.info("success to update user next turn yn.");
        } catch (Exception e) {
            result.setResult("FAIL");
            logger.error("fail to update user next turn yn.");
        }

        if((result.getResult()).equals("SUCCESS")) {
            try {
                // 사용자 id 로 사용자 정보를 가져 온다.
                WaitingUser admissionUser = this.waitingUserService.selectUserInformationById(waitingUser);

                if(!(admissionUser.getQrCode()).equals("")) {
                    // QR 코드로 등록했으면 Push Notification 을 보낸다.
                    WaitingMember parameterMember = new WaitingMember();
                    parameterMember.setQrCode(admissionUser.getQrCode());

                    WaitingMember resultMember = this.waitingMemberService.selectMemberInformation(parameterMember);

                    String deviceType = resultMember.getDeviceType();
                    String registrationId = resultMember.getRegistrationId();
                    String receiveNotificationYn = resultMember.getReceiveNotificationYn();
                    String messageContent = "NEXT_TURN";

                    if((("AS").equals(deviceType)) && (("Y").equals(receiveNotificationYn)) && (!("").equals(registrationId))) {
                        // Android Smart Phone 으로 Push Notification 을 보낸다.
                        waitingCommon.sendASMessage(registrationId, messageContent);
                    } else if((("IS").equals(deviceType)) && (("Y").equals(receiveNotificationYn)) && (!("").equals(registrationId))) {
                        // iOS Smart Phone 으로 Push Notification 을 보낸다.
                        waitingCommon.sendIPMessage(registrationId, messageContent);
                        waitingCommon.testSendIPMessage(registrationId, messageContent);
                    }
                } else if(!(admissionUser.getPhoneNumber()).equals("")) {
                    // 전화번호로 등록했으면 SMS 를 보낸다.
                    WaitingSMS parameterSMS = new WaitingSMS();

                    parameterSMS.setMsg("다음 차례입니다.");
                    parameterSMS.setRphone(waitingCommon.getSMSPhoneNumber(admissionUser.getPhoneNumber()));
                    parameterSMS.setSphone1("02");
                    parameterSMS.setSphone2("3775");
                    parameterSMS.setSphone3("3799");
                    parameterSMS.setRdate("");
                    parameterSMS.setRtime("");
                    parameterSMS.setTestflag("");
                    parameterSMS.setDestination(waitingCommon.getSMSPhoneNumber(admissionUser.getPhoneNumber()));
                    parameterSMS.setRepeatFlag("");
                    parameterSMS.setRepeatNum("");
                    parameterSMS.setRepeatTime("");
                    parameterSMS.setNointeractive("");

                    logger.info("sms : {}", waitingCommon.getSMSPhoneNumber(admissionUser.getPhoneNumber()));

                    this.waitingCommon.sendSMS(parameterSMS);
                }

                logger.info("success to send push notification or sms.");
            } catch (Exception e) {
                logger.info("fail to send push notification or sms.");
            }
        }

        return result;
    }

    /**
     * 현재 대기자를 입장 처리 하고 다음 대기자의 next_turn_yn 의 값을 'Y' 로 업데이트 한다.
     *
     * 현재 대기자 입장처리와 대음 대기자의 next_turn_yn 값 업데이트를 1개의 transaction 에서 처리 한다.
     *
     * @param waitingUser
     * @return
     * @throws Exception
     */
    @RequestMapping(value = "/updateUserAdmissionYnAndUserNextTurnYn", method = RequestMethod.POST)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public WaitingUser updateUserAdmissionYnAndUserNextTurnYn(@RequestBody WaitingUser waitingUser) throws Exception {
        logger.info("updateUserAdmissionYnAndUserNextTurnYn");

        waitingUser.setYesterdayString(this.waitingCommon.getYesterdayString());
        waitingUser.setTomorrowString(this.waitingCommon.getTomorrowString());

        WaitingUser result = new WaitingUser();

        try {
            this.waitingUserService.updateUserAdmissionYnAndUserNextTurnYn(waitingUser);
            result.setResult("SUCCESS");
            logger.info("success to update admission and next turn yn.");
        } catch (Exception e) {
            result.setResult("FAIL");
            logger.error("fail to update admission and next turn yn.");
        }

        // 입장 대기자.
        if((result.getResult()).equals("SUCCESS")) {
            try {

                // 사용자 id 로 사용자 정보를 가져 온다.
                waitingUser.setIdWaitingUsers(waitingUser.getIdWaitingUsersAdmissionYn());
                WaitingUser admissionUser = this.waitingUserService.selectUserInformationById(waitingUser);

                if(!(admissionUser.getQrCode()).equals("")) {
                    // QR 코드로 등록했으면 Push Notification 을 보낸다.
                    WaitingMember parameterMember = new WaitingMember();
                    parameterMember.setQrCode(admissionUser.getQrCode());

                    WaitingMember resultMember = this.waitingMemberService.selectMemberInformation(parameterMember);

                    String deviceType = resultMember.getDeviceType();
                    String registrationId = resultMember.getRegistrationId();
                    String receiveNotificationYn = resultMember.getReceiveNotificationYn();
                    String messageContent = "ADMISSION";

                    if((("AS").equals(deviceType)) && (("Y").equals(receiveNotificationYn)) && (!("").equals(registrationId))) {
                        // Android Smart Phone 으로 Push Notification 을 보낸다.
                        waitingCommon.sendASMessage(registrationId, messageContent);
                    } else if((("IS").equals(deviceType)) && (("Y").equals(receiveNotificationYn)) && (!("").equals(registrationId))) {
                        // iOS Smart Phone 으로 Push Notification 을 보낸다.
                        waitingCommon.sendIPMessage(registrationId, messageContent);
                        waitingCommon.testSendIPMessage(registrationId, messageContent);
                    }
                } else if(!(admissionUser.getPhoneNumber()).equals("")) {
                    // 전화번호로 등록했으면 SMS 를 보낸다.
                    WaitingSMS parameterSMS = new WaitingSMS();

                    parameterSMS.setMsg("입장하시기 바랍니다.");
                    parameterSMS.setRphone(waitingCommon.getSMSPhoneNumber(admissionUser.getPhoneNumber()));
                    parameterSMS.setSphone1("02");
                    parameterSMS.setSphone2("3775");
                    parameterSMS.setSphone3("3799");
                    parameterSMS.setRdate("");
                    parameterSMS.setRtime("");
                    parameterSMS.setTestflag("");
                    parameterSMS.setDestination(waitingCommon.getSMSPhoneNumber(admissionUser.getPhoneNumber()));
                    parameterSMS.setRepeatFlag("");
                    parameterSMS.setRepeatNum("");
                    parameterSMS.setRepeatTime("");
                    parameterSMS.setNointeractive("");

                    logger.info("sms : {}", waitingCommon.getSMSPhoneNumber(admissionUser.getPhoneNumber()));

                    this.waitingCommon.sendSMS(parameterSMS);
                }

                logger.info("success to send push notification or sms.");
            } catch (Exception e) {
                logger.info("fail to send push notification or sms.");
            }
        }

        // 다음 대기자.
        if((result.getResult()).equals("SUCCESS")) {
            try {

                // 사용자 id 로 사용자 정보를 가져 온다.
                waitingUser.setIdWaitingUsers(waitingUser.getIdWaitingUsersNextTurnYn());
                WaitingUser admissionUser = this.waitingUserService.selectUserInformationById(waitingUser);

                if(!(admissionUser.getQrCode()).equals("")) {
                    // QR 코드로 등록했으면 Push Notification 을 보낸다.
                    WaitingMember parameterMember = new WaitingMember();
                    parameterMember.setQrCode(admissionUser.getQrCode());

                    WaitingMember resultMember = this.waitingMemberService.selectMemberInformation(parameterMember);

                    String deviceType = resultMember.getDeviceType();
                    String registrationId = resultMember.getRegistrationId();
                    String receiveNotificationYn = resultMember.getReceiveNotificationYn();
                    String messageContent = "NEXT_TURN";

                    if((("AS").equals(deviceType)) && (("Y").equals(receiveNotificationYn)) && (!("").equals(registrationId))) {
                        // Android Smart Phone 으로 Push Notification 을 보낸다.
                        waitingCommon.sendASMessage(registrationId, messageContent);
                    } else if((("IS").equals(deviceType)) && (("Y").equals(receiveNotificationYn)) && (!("").equals(registrationId))) {
                        // iOS Smart Phone 으로 Push Notification 을 보낸다.
                        waitingCommon.sendIPMessage(registrationId, messageContent);
                        waitingCommon.testSendIPMessage(registrationId, messageContent);
                    }
                } else if(!(admissionUser.getPhoneNumber()).equals("")) {
                    // 전화번호로 등록했으면 SMS 를 보낸다.
                    WaitingSMS parameterSMS = new WaitingSMS();

                    parameterSMS.setMsg("다음 차례입니다.");
                    parameterSMS.setRphone(waitingCommon.getSMSPhoneNumber(admissionUser.getPhoneNumber()));
                    parameterSMS.setSphone1("02");
                    parameterSMS.setSphone2("3775");
                    parameterSMS.setSphone3("3799");
                    parameterSMS.setRdate("");
                    parameterSMS.setRtime("");
                    parameterSMS.setTestflag("");
                    parameterSMS.setDestination(waitingCommon.getSMSPhoneNumber(admissionUser.getPhoneNumber()));
                    parameterSMS.setRepeatFlag("");
                    parameterSMS.setRepeatNum("");
                    parameterSMS.setRepeatTime("");
                    parameterSMS.setNointeractive("");

                    logger.info("sms : {}", waitingCommon.getSMSPhoneNumber(admissionUser.getPhoneNumber()));

                    this.waitingCommon.sendSMS(parameterSMS);
                }

                logger.info("success to send push notification or sms.");
            } catch (Exception e) {
                logger.info("fail to send push notification or sms.");
            }
        }

        return result;
    }

    /**
     * 다음 대기자를 찾는다.
     *
     * 이 메소드는 더 이상 사용되지 않는다.
     *
     * @param waitingUser
     * @return
     * @throws Exception
     */
    @RequestMapping(value = "/selectUserNextTurn", method = RequestMethod.POST)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public WaitingUser selectUserNextTurn(@RequestBody WaitingUser waitingUser) throws Exception {
        logger.info("selectUserNextTurn");

        waitingUser.setRegisterDate(waitingUser.getRegisterDate().substring(0, 10));

        logger.info("merchantId   : {}", waitingUser.getMerchantId());
        logger.info("nextTurnYn   : {}", waitingUser.getNextTurnYn());
        logger.info("activateYn   : {}", waitingUser.getActivateYn());
        logger.info("registerDate : {}", waitingUser.getRegisterDate());

        return this.waitingUserService.selectUserNextTurn(waitingUser);
    }

    /**
     * 내 앞으로 남은 대기자 총 수를 가져 온다.
     *
     * @param waitingUser
     * @return
     * @throws Exception
     */
    @RequestMapping(value = "/selectRemainUserTotalCountBeforeMe", method = RequestMethod.POST)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public WaitingUser selectRemainUserTotalCountBeforeMe(@RequestBody WaitingUser waitingUser) throws Exception {
        logger.info("selectRemainUserTotalCountBeforeMe");

        waitingUser.setCompareNumberWaiting(Integer.parseInt(waitingUser.getNumberWaiting()));
//        waitingUser.setRegisterDate(waitingUser.getRegisterDate().substring(0, 10));

        waitingUser.setYesterdayString(this.waitingCommon.getYesterdayString());
        waitingUser.setTomorrowString(this.waitingCommon.getTomorrowString());

        logger.info("merchantId    : {}", waitingUser.getMerchantId());
        logger.info("admissionYn   : {}", waitingUser.getAdmissionYn());
        logger.info("activateYn    : {}", waitingUser.getActivateYn());
        logger.info("numberWaiting : {}", waitingUser.getNumberWaiting());

        return this.waitingUserService.selectRemainUserTotalCountBeforeMe(waitingUser);
    }

    /**
     * 사용자가 대기 등록된 적이 있었는지 확인한다.
     * 추천 로직에서 사용한다.
     *
     * @param waitingUser
     * @return
     * @throws Exception
     */
    @RequestMapping(value = "/selectUserRegistered", method = RequestMethod.POST)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public WaitingUser selectUserRegistered(@RequestBody WaitingUser waitingUser) throws Exception {
        logger.info("selectUserRegistered");

        return this.waitingUserService.selectUserRegistered(waitingUser);
    }

    /**
     * 오늘 총 등록팀과 등록인원 정보를 가져 온다.
     *
     * @param waitingUser
     * @return
     * @throws Exception
     */
    @RequestMapping(value = "/selectRegisterTeamAndUser", method = RequestMethod.POST)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public WaitingUser selectRegisterTeamAndUser(@RequestBody WaitingUser waitingUser) throws Exception {
        logger.info("selectRegisterTeamAndUser");

        // 등록일자를 날짜까지 끊어서 다시 세팅한다.
//        waitingUser.setRegisterDate(waitingUser.getRegisterDate().substring(0, 10));

        waitingUser.setYesterdayString(this.waitingCommon.getYesterdayString());
        waitingUser.setTomorrowString(this.waitingCommon.getTomorrowString());

        List<WaitingUser> result = this.waitingUserService.selectRegisterTeamAndUser(waitingUser);

        WaitingUser user = new WaitingUser();

        // 금일 총 방문 팀 수를 세팅 한다.
        user.setRegisterTeamCount(result.size()+"");

        /*
        만약 목록이 있으면 총 등록인원을 세팅한다.
        * */
        if(result.size() > 0) {
            int companyCount = 0;

            for(WaitingUser parameter : result) {
                companyCount = companyCount + Integer.parseInt(parameter.getCompanion());
            }

            logger.info("companyCount : {}", companyCount);

            // 금일 총 방문 인원 수를 세팅 한다.
            user.setRegisterPersonCount(companyCount+"");
        } else {
            // 만약 등록된 고객이 없으면 인원 수는 null 이 되기 때문에 '0' 으로 세팅한다.
            user.setRegisterPersonCount("0");
        }

        return user;
    }

    /**
     * 오늘 가장 최근에 등록/입장한 고객 2 팀의 목록을 가져 온다.
     *
     * @param waitingUser
     * @return
     * @throws Exception
     */
    @RequestMapping(value = "/selectRecentAdmissionUserList", method = RequestMethod.POST)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public List<WaitingUser> selectRecentAdmissionUserList(@RequestBody WaitingUser waitingUser) throws Exception {
        logger.info("selectRecentAdmissionUserList");

        waitingUser.setYesterdayString(this.waitingCommon.getYesterdayString());
        waitingUser.setTomorrowString(this.waitingCommon.getTomorrowString());

        return this.waitingUserService.selectRecentAdmissionUserList(waitingUser);
    }

    /**
     * 오늘 등록/입장한 고객 목록을 가져 온다.
     *
     * @param waitingUser
     * @return
     * @throws Exception
     */
    @RequestMapping(value = "/selectTodayAdmissionUserList", method = RequestMethod.POST)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public List<WaitingUser> selectTodayAdmissionUserList(@RequestBody WaitingUser waitingUser) throws Exception {
        logger.info("selectTodayAdmissionUserList");

        waitingUser.setYesterdayString(this.waitingCommon.getYesterdayString());
        waitingUser.setTomorrowString(this.waitingCommon.getTomorrowString());

        return this.waitingUserService.selectTodayAdmissionUserList(waitingUser);
    }
}
